/**
 1、实现弹窗组件
  1、概念
    1、弹窗这类组件的特点是它们在当前vue实例之外独立存在，通常挂载与body，他们是通过js动态创建的，不需要再任何组件中声明
  2、调用
    2、组件调用时，接收一个组件，还接收弹窗显示的什么内容
  3、组件的获取
    1、组件的构造函数如何获取呢，
    2、我们平常写的这些组件，它是构造函数么，最后export 出去的是一个对象，它只是一个配置对象，这个配置对象将来是不是必须要变成实例
    3、怎么变成实例，平常写的这些组件的配置项，需要变成构造函数，然后才能创建实例，
    4、方法一，是vue.extend()方法可以得到构造函数，
    5、方法二，我们可以使用render方法，渲染函数，直接把它渲染出来，
    6、借助vue创建vue实例，我们在写main的时候，我们会写render函数，我们傻傻的，不知道这个render函数是干什么的，也不知道后面的这个$mount("#app")是干什么的
    7、h是createElement(),它会返回虚拟dom，怎么变成真实dom呢，它需要挂在，所以大家看到main.js里看到$mount，它最终才会把虚拟dom放到宿主元素上去
    8、我传一个props，把咱们这个参数传进去这个实例会把将来作为跟组件是不是就把它渲染出来了，但是$mount的时候，不去指定最终的目标
    9、不指定宿主元素，则会创建真实dom，但是不会做dom的追加。因为没有目标对象可以追加
    10、官方也明确说了，这里不可以使用body，使用body会报错
    11、由于vue已经帮我们把这个虚拟dom变成真实dom了，就是只要这个方法一执行，就可以得到
    12、通过vm.$el属性
    13、然后可以挂在了。document.body.appendChild(vm.$el)
    14、一定要要把这个组件的实例得到，因为这个create方法最终的目标是把这个组件实例返回
    15、现在组件实例在哪呢，又涉及到获取组件实例的方法，现在它是我们的跟组件。找到所有的孩子，它是第一个
    16、所以comp= vm.$children[0]
    17、为什么不能指定body，因为body中还有其它东西呢，你直接替换了，把人家全覆盖了，这相当于删库跑路
2、为什么挂载router实例
  1、我在这只是注册了router，它是怎么做到Vue.prototype.$router=router
  2、是不是需要有一个事要做呀，就是我们在插件里面肯定有一个事就是拿出当前这个选项，然后把它挂载到prototype.$router上
  3、挂载这个实例，事为了在所有组件里面都可以使用，都可以访问到咱们路由的实例
  4、我们是不是导一个router-link和router-view呀，这个router-view本身是程序的出口，它起到了容器的作用，或者茅坑的作用
  5、将来所有的内容是不是都在这里做刷新和替换呀。这是如何替换的，还有这个router-link和router-view是哪里来的
  6、这两个组件为什么可以直接用。说明我们插件里面会有这两个组件的声明和注册 
  7、url发生变化，页面不刷新，有两种方式对不对
    1、大家可以通过hash的方式 #,我们可以收到hashchange事件，我们是不是可以知道我们的hash发生变化了
    2、我只需要把hash对应的那个组件找到，并且重新渲染出来就性了
    3、我们在创建路由器实例的时候，我们是不是创建了一个路由表，我们在路由表里面是不是可以得到path
    4、比如说这个path，是斜杠，然后是不是会有一个斜杠对应的路由的配置，里面是不是有一个component
    5、类似的是不是还有/about。将来当我监听的那个hashchange 发生变化的时候，我是不是可以来这那东西呀
    6、我来这那东西，我拿到了一个路由，这个路由我把它拿过来，是不是希望把这边对应的那个component在这个界面中渲染
    7、所以这里面一定有一个去渲染这个组件内容的一个组件，这个组件，我们给它起一个名字，就叫router-view
    8、所以其实它要做的事情是它必须动态根据这个地址的变化，然后呢能够获取到最新的component，并且把它渲染到这里
    9、这就是我们的单项数据它怎么去转起来的。我要监听的是hashchange事件
    10、我们还要建一个路由表，然后呢，当这个change发生变化的时候，我就在路由表拿出最新的组件，然后让这个router-view重新渲染
    11、这就是它的思路
3、创建kvue-route.js
  1、就是把route的实例给它挂载到咱们prototype上
  2、一个插件就是一个普通的对象，只要实现一个install方法就可以了，
  3、实现rooter-link
    1、为什么不能使用template，
      1、我们使用的是一个纯运行时的版本，因为我们现在使用的时webpack环境，在我们最终编译的版本中是不存在编译器
  4、路由变了，但是视图不更新
    1、不管在任何组件中，只要用到了这个current，我们都会把它收集起来
    1、用uitl.defineReactive,将来只要我变了，我就会通知那些用到的地方去做更新，也就是说它们的render函数会重新执行
4、vuex
  1、概念
    1、vuex集中式存储管理应用的所有组件的状态，并以相应的规则保证状态以可预测的方式发生变化
    2、什么是集中式，自然而然就是整个应用程序的状态集中在一个store中去保存
    3、什么叫可预测，也就是说经过严格的限定，所有使用数据的人，它都不知道这个数据是哪来的，就是别人直接给它的，而它想改这个数据呢
    4、它也不能直接改，它必须通过人家提供给它的修改方法，
    5、当这个状态发生变化时，它时怎么通知视图去更新的，也是它和redux，react那边是不是有一个redux,最不同的地方
    6、只要这个state里面的值发生变化了，是不是用到这些key的那些个视图都会重新render，这就明白了，并不是说有什么神奇的力量把这个值给送过来了
    7、其实只是大家重新渲染了，只是组件知道数据变了，它重新渲染了。由数据响应式做到的，vue做到了这一点
    8、但是redux里面截然不同，它会把这些更新函数做订阅，它其实用了一个发布订阅的模式，会把这些更新函数直接订阅 ，通过订阅的方式传给了redux
    9、这个时候只要redux收到了，这个时候redux只要数据发生变化了，其实它只做一件事，它就把刚才所有订阅的回调函数重新执行一遍
    10、数据跟新变更通知的这种方式，两者时截然不同的，它时用了一个发布订阅的方式，





















































 */